/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package serverb.negocio;



import com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException;
import java.util.Date;
import java.text.ParseException;
import java.util.logging.Level;
import java.util.logging.Logger;
import server.dominio.Horario;
import server.dominio.Usuario;
import java.sql.SQLException;
import java.sql.Time;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Vector;
import org.hibernate.exception.ConstraintViolationException;
import server.dominio.Beneficiario;
import server.dominio.Cita;
import server.dominio.Medico;
import server.excepciones.BeneficiarioInexistenteException;

import server.excepciones.BeneficiarioNoExistenteException;
import server.excepciones.BeneficiarioYaExistenteException;
import server.excepciones.CitaNoValidaException;
import server.excepciones.CitaYaExistenteException;
import server.excepciones.CitasPendientesException;
import server.excepciones.FechaNoValidaException;
import server.excepciones.MedicoInexistenteException;
import server.excepciones.MedicoNoExistenteException;
import server.excepciones.MedicoYaExistenteException;

import server.excepciones.UsuarioNoExistenteException;

import server.excepciones.UsuarioYaExistenteException;
import server.persistencia.DAOBeneficiario;
import server.persistencia.DAOCita;
import server.persistencia.DAOFactory;
import server.persistencia.DAOHora;
import server.persistencia.DAOMedico;
import server.persistencia.DAOMedicoMySQL;
import server.persistencia.DAOUsuario;
import serverb.persistenciaHibernate.Hibernate_Cita_DAO;


/**
 *
 * @author tpaxle
 */
public class Fachada_ServidorB {
   // private
    private DAOFactory factoriadaos;

    public Fachada_ServidorB(){
        factoriadaos= DAOFactory.getFactory();
    }


  
 public ArrayList<Object> getHorarios(Medico medico) throws SQLException {
        ArrayList<Object> listahoras;
        DAOHora daoHora= factoriadaos.crearDAOHora();
        listahoras= daoHora.select("SELECT * FROM horario WHERE id_Medico_fk="+medico.getIdMedicoPk());
        daoHora.cerrarDAO();
        return listahoras;
    }

    /*Insercion de datos en la base de datos
     * Beneficiario, medico, husuario u horas
     * 
     */
    public void nuevobeneficiario(Beneficiario beneficiario) throws SQLException, BeneficiarioYaExistenteException{
        DAOBeneficiario daoBeneficiario= factoriadaos.crearDAOBeneficiario();
        try{
            daoBeneficiario.insert(beneficiario);
        } catch (com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException ex) {
            //Ya hay un usuario con el mismo nif o el mismo login

            throw new BeneficiarioYaExistenteException(ex.toString());
        }finally{
            daoBeneficiario.cerrarDAO();
        }
    }
    public void nuevomedico(Medico medico) throws SQLException, MedicoYaExistenteException {
        DAOMedico daoMedico= factoriadaos.crearDAOMedico();

        try {
            daoMedico.insert(medico);
        } catch (MySQLIntegrityConstraintViolationException ex) {
            //Ya hay un usuario con el mismo nif o el mismo login
            throw new MedicoYaExistenteException(ex.toString());
        }finally{
            daoMedico.cerrarDAO();
        }
    }
    public void nuevousuario(Usuario usuario) throws UsuarioYaExistenteException, SQLException{
        DAOUsuario daoUsuario = factoriadaos.crearDAOUsuario();
        try {
            daoUsuario.insert(usuario);
        } catch (MySQLIntegrityConstraintViolationException ex) {
            throw new UsuarioYaExistenteException("El usario:\n "+ usuario+"\nExiste:");
        } finally{
            daoUsuario.cerrarDAO();            
        }

    }
    public int insertarhora(Horario hora_insert) throws SQLException {
        DAOHora daoHora= factoriadaos.crearDAOHora();
        int resultado = 0;
        resultado= daoHora.insert(hora_insert);
        daoHora.cerrarDAO();
        return resultado;

    }



  //true significa que existe medico perdido
    public Medico comprobarmedicoperdido(Medico medico_aux) throws SQLException {
        DAOMedico daom= factoriadaos.crearDAOMedico();
        Medico medico= (Medico) daom.find("SELECT * FROM Medico, Usuario WHERE idUsuario_fk= idUsuario_pk and idUsuario_pk= "+ medico_aux.getUsuario().getIdUsuarioPk());
        daom.cerrarDAO();
        return medico;
    }
 



    /**Modificacion de datos**/
    public void actualizar(Beneficiario beneficiario) throws SQLException, BeneficiarioYaExistenteException, BeneficiarioNoExistenteException  {
        DAOBeneficiario daobene= null;
        try{
            daobene= factoriadaos.crearDAOBeneficiario();
            if(daobene.update(beneficiario)==0)
                throw new BeneficiarioNoExistenteException("El beneficiario "+ beneficiario +"; no existe");
        } catch (MySQLIntegrityConstraintViolationException ex) {
              throw new BeneficiarioYaExistenteException("El Beneficiario: "+beneficiario +"; existe");
        } finally{
            daobene.cerrarDAO();
        }
    }
    public void modificarUsuario(Usuario usuario) throws SQLException, UsuarioYaExistenteException, UsuarioNoExistenteException {
            DAOUsuario daou = factoriadaos.crearDAOUsuario();
            try {
                if(daou.update(usuario)==0)
                    throw new UsuarioNoExistenteException("El Usuario: "+ usuario +"; no existe");
            } catch (MySQLIntegrityConstraintViolationException ex) {
                  throw new UsuarioYaExistenteException("El Usuario: "+usuario +"; existe");
            } finally{
                daou.cerrarDAO();
            }

        }
    public void actualizar(Medico medico) throws SQLException, MedicoYaExistenteException, MedicoNoExistenteException {
        DAOMedico daomed= factoriadaos.crearDAOMedico();
        try {
            //En primer lugar se actualiza el usuario si se puede
            this.modificarUsuario(medico.getUsuario());
            //Si hay error, la excepcion va hacia arriba

        } catch (UsuarioYaExistenteException ex) {
            throw new MedicoYaExistenteException(ex.toString());
        } catch (UsuarioNoExistenteException ex){
           throw new MedicoNoExistenteException("El medico: "+ medico + "No se puede introducir en la bbdd");
        }
       //Si hay error, la excepcion va hacia arriba

       daomed.update(medico);
       daomed.cerrarDAO();

    }

  

    public void eliminarusuario(Usuario usuario_aux) throws SQLException, UsuarioNoExistenteException {
        DAOUsuario daou = factoriadaos.crearDAOUsuario();
        if(daou.delete(usuario_aux) ==0){
            daou.cerrarDAO();
            throw new UsuarioNoExistenteException("Usuario: " +usuario_aux +"\nNo existente");
        }
        daou.cerrarDAO();
    }
    public void eliminarmedico(Medico medico) throws SQLException, MedicoNoExistenteException {
        DAOMedico daom= new DAOMedicoMySQL();
        int result= daom.delete(medico);
        daom.cerrarDAO();
        if(result==0){
            throw new MedicoNoExistenteException("El Medico "+ medico+ ", que itenta" +
                    "eliminar no existe en la bbdd");
        }
    }
    public void eliminarbeneficiario(Beneficiario beneficiario) throws SQLException, BeneficiarioNoExistenteException, CitasPendientesException {
        DAOBeneficiario daobene= factoriadaos.crearDAOBeneficiario();
        //En primer lugar se comprueba si tiene citas pendiesntes, en tal caso no se puede eliminar
        if(this.citaspendientes(beneficiario.getNif())==0){
            if(daobene.delete(beneficiario)== 0){
                daobene.cerrarDAO();
                throw new BeneficiarioNoExistenteException("El beneficiario: "+ beneficiario+ "No existe");
            }
        }else{
            daobene.cerrarDAO();
            throw new CitasPendientesException("Citas");
        }

}

    private int citaspendientes(String dni) throws SQLException{
        DAOCita daocita= factoriadaos.crearDAOCita();
        ArrayList<Object> lista= daocita.select("SELECT * FROM Cita, Beneficiario Where idBeneficiario_pk=idBeneficiario_fk and Nif= '"+ dni +"'");
        daocita.cerrarDAO();
        return lista.size();
    }

    public void formatearhorario(Medico medico) throws SQLException {
        ArrayList<Object> listahoras= this.getHorarios(medico);
        DAOHora daoHora= factoriadaos.crearDAOHora();
        for(Object hora: listahoras){
            daoHora.delete(hora);
        }
        daoHora.cerrarDAO();
    }

    public void pedirCita(Beneficiario beneficiario, String idMedico, String FechayHora) throws SQLException, CitaYaExistenteException, MedicoInexistenteException, FechaNoValidaException, BeneficiarioInexistenteException, Exception {


        Hibernate_Cita_DAO dao= new Hibernate_Cita_DAO();
        DAOMedico daom= factoriadaos.crearDAOMedico();
        DAOHora daoh= factoriadaos.crearDAOHora();
        DAOBeneficiario daoB= factoriadaos.crearDAOBeneficiario();

        Cita cita=null;
        DateFormat formatearFecha= new SimpleDateFormat("yyyy-MM-dd");
        DateFormat formatearHora= new SimpleDateFormat("HH:mm");
        DateFormat formatearFechaHora= new SimpleDateFormat("yyyy-MM-dd HH:mm");



        Beneficiario bene= null;
        bene= (Beneficiario) daoB.find("SELECT * FROM Beneficiario where idBeneficiario_pk= '"+beneficiario.getIdBeneficiarioPk()+"'");
        daoB.cerrarDAO();
        if(bene==null)
            throw new BeneficiarioInexistenteException("El beneficiario ya no existe");

        Medico medicoi= (Medico) daom.find("SELECT * From Medico WHERE idMedico_pk= '"+ idMedico+"'");
        daom.cerrarDAO();

        //Descomponemos la fecha
        Calendar fecha= Calendar.getInstance();
        Date fechaf= null;
        String hora = null;
        try {
            fechaf= formatearFechaHora.parse(FechayHora);
        } catch (ParseException ex) {
            Logger.getLogger(Fachada_ServidorB.class.getName()).log(Level.SEVERE, null, ex);
        }
        Date horafecha= null;
        String cadena= FechayHora.substring(11, 16);
        try {
            horafecha = formatearHora.parse(FechayHora.substring(11, 16));
        } catch (ParseException ex) {
            Logger.getLogger(Fachada_ServidorB.class.getName()).log(Level.SEVERE, null, ex);
        }

        Horario hora_aux= (Horario) daoh.find("SELECT * FROM Horario WHERE id_medico_fk="+idMedico +" and dia='"+formatearFecha.format(fechaf)+"' and Desde <= '"+formatearHora.format(fechaf)+"' and Hasta >= '"+ formatearHora.format(fechaf)+"'");
        daoh.cerrarDAO();
        if(hora_aux==null)
            throw new FechaNoValidaException("La fecha introducida no es correcta");
        if(medicoi==null)
            throw new MedicoInexistenteException("El medico con idMedico "+ idMedico + "No existe");

        cita = new Cita(hora_aux, beneficiario,horafecha);

        try{
            dao.insertCita(cita);
        }catch(ConstraintViolationException ex){
            throw new CitaYaExistenteException("Ya existe una fecha esste dia para este usuario");
        }
    }



    public void eliminarcitas(Cita cita) throws SQLException, CitaNoValidaException {
        Hibernate_Cita_DAO dao= new Hibernate_Cita_DAO();
        int result=0;
        result=dao.deleteCita(cita);
        if(result== 0)
            throw new CitaNoValidaException("La cita ya no existe: "+ cita.getIdCitaPk());
    }

/*C:\Users\tpaxle>jar -cvf C:\Users\tpaxle\Documents\NetBeansProjects\ISO2ServidorB\libs\clases.jar -C C:\Users\tpaxle\Documents\NetBeansProjects\ISO2Servidor\build\classes\ server\dominio -C C:\Users\tpaxle\Documents\NetBeansProjects\ISO2Servidor\build\classes server\excepciones -C C:\Users\tpaxle\Documents\NetBeansProjects\ISO2Servidor\build\classes server\persistencia*/

    
}
